    //定义一个变量，用来保存定时器的标识
    /*
        目前我们的定时器的标识由全局变量timer保存，
            所有的正在执行的定时器都在这个变量中保存
    */
    // var timer;

    /*
        参数
        📌    obj:要执行动画的对象
        📌    attr：要执行动画的样式，比如：left top width height
        📌    target:执行动画的距离
        📌    speed：移动的速度(正数向右，负数向左)
        📌    callback：回调函数，这个函数将会在动画执行完毕以后执行
    */
    function move(obj,attr,target,speed,callback){
        // 关闭上一个定时器 ,防止定时器重叠速度异常
        clearInterval(obj.timer);

        // 获取元素目前的位置   ⭐⭐📌
        var current = parseInt(getStyle(obj,"left"));
        // 判断速度的正负值     ⭐⭐📌
        // 如果从0向800移动，则speed为正
        // 如果从800向0移动，则speed为负
        if(current > target){
            // 此时速度应为负值
            speed = -speed;
        }

        // 开启一个定时器，用来执行动画效果
        // 向执行动画的对象中添加一个 timer属性，用来保存自己的定时器的标识
        obj.timer = setInterval(function(){
            // 获取 box1 的原来的left值
            var oldValue = parseInt(getStyle(obj,attr));

            // 在旧值的基础上增加（控制速度）
            var newValue = oldValue + speed;

            // 当 newValue 大于800时，使其等于800，防止等于 801 的情况
            // 向左移动时，需要判断newValue是否小于 target  ⭐⭐📌
            // 向右移动时，需要判断newValue是否大于 target
            if((speed<0 && newValue<target) || (speed>0 && newValue>target)){
                newValue = target;
            }
            obj.style[attr] = newValue + "px";

            // 判断 newValue 是否等于800，
            if(newValue == target){
                // 如符合判断则关闭定时器
                clearInterval(obj.timer);
                //动画执行完毕，调用回调函数
                callback && callback();
            }
        }, 30);
    }


    // 定义一个函数，返回一个元素的 当前样式属性值
    function getStyle(obj,name){
        // 判断浏览器是否有该方法，使其兼容不同的浏览器
        if(window.getComputedStyle){
            // getComputedStyle() 返回一个元素的 当前样式属性值
            return getComputedStyle(obj,null)[name];
        }else{
            // 同上 写法不同（兼容IE8）
            return obj.currentStyle[name];
        }
    }

    // 定义一个函数，用来向一个元素中添加指定的 class 属性值 ⭐⭐📌
    /*
        参数： 
            obj 要添加 class 属性的元素
            cn  要添加的 class 值
    */
            function addClass(obj, cn){
                // 检查 obj 中是否含有 cn
                if(!hasClass(obj,cn)){
                    obj.className += ""+cn;
                }
                
            }
            
            /*
                判断一个元素中是否含有指定的 class 属性值 ⭐⭐📌
                    如果右该class 返回true 否则返回 false
            */
            function hasClass(obj, cn){
                // 判断 obj中有没有 cn class
                // 创建一个正则
                // var reg = /\bb2\b/;
                var reg = new RegExp("\\b"+cn+"\\b");
        
        
                return reg.test(obj.className);
            }
        
            // 删除一个元素中的指定的 class 属性 ⭐⭐📌
            function removeClass(obj,cn){
                // 创建一个正则表达式
                var reg = new RegExp("\\b"+cn+"\\b");
        
                // 删除 class
                obj.className = obj.className.replace(reg,"");
            }
        
            /*
                toggleClass可以用来切换一个类 ⭐⭐📌
                    如果元素中具有该类，则删除
                    如果元素中没有该类，则添加
            */
            function toggleClass(obj, cn){
                if(hasClass(obj,cn)){
                    // 有，则删除
                    removeClass(obj,cn);
                }else{
                    // 没有，则添加
                    addClass(obj,cn);
                }
            }